// src/roles/entities/role.entity.ts
import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  UpdateDateColumn,
  ManyToMany,
  JoinTable,
  OneToMany,
} from 'typeorm';
import { User } from '../../user/entities/user.entity';
import { Permission } from '../../permission/entities/permission.entity';
import { v4 as uuidv4 } from 'uuid';

@Entity('role')
export class Role {
  @PrimaryGeneratedColumn('uuid')
  id: string = uuidv4();

  // 角色名，唯一且不可为空
  @Column({ length: 100, unique: true })
  name: string;

  // 角色描述，可为空
  @Column({ type: 'text', nullable: true })
  description: string;

  // 角色的创建时间
  @CreateDateColumn()
  created_at: Date;

  // 角色的最后更新时间
  @UpdateDateColumn()
  updated_at: Date;

  // 与用户的多对多关系，关联角色的用户
  @OneToMany(() => User, (user) => user.role)
  users: User[];

  // 与权限的多对多关系，关联角色的权限
  @ManyToMany(() => Permission, (permission) => permission.roles, {
    nullable: true,
    cascade: false,
  })
  @JoinTable({
    name: 'role_permissions',
    joinColumn: { name: 'role_id', referencedColumnName: 'id' },
    inverseJoinColumn: { name: 'permission_id', referencedColumnName: 'id' },
  })
  permissions: Permission[];

  // 角色是否已删除（逻辑删除），默认为未删除
  @Column({ default: false })
  is_deleted: boolean;

  // 角色是否禁用，默认为禁用
  @Column({ default: false })
  is_disabled: boolean;

  // 角色是否是系统默认角色，默认是 false
  @Column({ default: false })
  is_default: boolean;

  // 角色是否允许分配权限，默认为 true
  @Column({ default: true })
  can_assign_permissions: boolean;

  // 角色的状态，默认是 'active'
  @Column({
    type: 'enum',
    enum: ['active', 'inactive', 'archived'],
    default: 'active',
  })
  status: string;

  // 角色的优先级，数值越小优先级越高
  @Column({ type: 'int', default: 0 })
  priority: number;

  // 角色的创建人ID，通常是系统管理员
  @Column({ type: 'int', nullable: true })
  created_by: number;

  // 角色的最后更新人ID
  @Column({ type: 'int', nullable: true })
  updated_by: number;

  // 角色所属的部门或组织
  @Column({ length: 100, nullable: true })
  department: string;

  // 角色的权限级别，数值越大代表权限级别越高
  @Column({ type: 'int', default: 1 })
  permission_level: number;

  // 角色的备注信息，可为空
  @Column({ type: 'text', nullable: true })
  remarks: string;

  // 角色的相关标签，使用逗号分隔
  @Column({ length: 255, nullable: true })
  tags: string;

  // 角色的访问日志，记录每次角色修改的操作内容
  @Column({ type: 'json', nullable: true })
  access_logs: object;

  // 角色的最大并发数，限制该角色的最大登录用户数
  @Column({ type: 'int', default: 1 })
  max_concurrent_users: number;

  // 角色是否可以拥有子角色
  @Column({ default: false })
  can_have_sub_roles: boolean;

  // 角色是否有外部API集成权限，默认没有
  @Column({ default: false })
  has_api_integration: boolean;

  // 角色是否启用通知功能，默认启用
  @Column({ default: true })
  is_notification_enabled: boolean;

  // 角色是否允许修改其权限，默认为不允许
  @Column({ default: false })
  can_modify_permissions: boolean;

  // 角色是否可删除，默认是可删除
  @Column({ default: true })
  can_delete: boolean;

  // 角色的访问IP范围，限制角色可访问的IP段
  @Column({ length: 255, nullable: true })
  allowed_ip_ranges: string;

  // 角色的创建时间戳（Unix格式）
  @Column({ type: 'bigint', nullable: true })
  created_at_timestamp: number;

  // 角色的更新时间戳（Unix格式）
  @Column({ type: 'bigint', nullable: true })
  updated_at_timestamp: number;

  // 角色的最大会话时长，单位秒
  @Column({ type: 'int', default: 3600 })
  max_session_duration: number;

  // 角色所属的项目或团队名称
  @Column({ length: 100, nullable: true })
  project: string;

  // 角色的管理范围，定义该角色能够管理的资源类型
  @Column({ length: 100, nullable: true })
  resource_scope: string;

  // 角色的语言偏好
  @Column({ length: 50, nullable: true })
  language_preference: string;

  // 角色的安全级别，数值越大代表安全级别越高
  @Column({ type: 'int', default: 1 })
  security_level: number;

  // 角色的地域范围，定义角色可以访问的地理区域
  @Column({ length: 255, nullable: true })
  geo_location: string;

  // 角色是否启用两步验证，默认为启用
  @Column({ default: true })
  is_two_factor_enabled: boolean;

  // 角色是否启用SSO（单点登录）
  @Column({ default: false })
  is_sso_enabled: boolean;

  // 角色的操作日志，记录角色执行的具体操作
  @Column({ type: 'json', nullable: true })
  action_logs: object;

  // 角色的关联的设备，限制哪些设备可以登录该角色
  @Column({ length: 255, nullable: true })
  associated_devices: string;

  // 角色是否允许更改其他角色的配置，默认为不允许
  @Column({ default: false })
  can_modify_other_roles: boolean;

  // 角色的访问控制策略，定义角色的访问权限模式（例如：RBAC，ABAC）
  @Column({ length: 50, nullable: true })
  access_control_policy: string;

  // 角色的合规性要求，定义角色必须遵循的合规标准
  @Column({ length: 255, nullable: true })
  compliance_requirements: string;
}
